package jdbc.datasource;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import org.apache.commons.dbcp.BasicDataSource;

public class DataSourceTest {
	public static void main(String[] args) throws Exception{
	
//		DataSource : Interface, DriverManager Upgrade 버전
//		아파치에서 제공하는 DBCP api 사용 -> BasicDataSource
		BasicDataSource bs = new BasicDataSource();
//		1. 객체가 DB와 연결하기 위한 정보 - 필수
		bs.setDriverClassName("oracle.jdbc.driver.OracleDriver");//DriverClass - 드라이버 로딩 처리
		bs.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:XE");
		bs.setUsername("scott");
		bs.setPassword("tiger");
		
//		2.Connection Pool 관련 설정 정보 - 옵션 (안하면 기본값대로 처리)
		
		bs.setInitialSize(3);//처음 생성할 커넥션의 개수를 지정 : 디폴트 값 = 0
		bs.setMaxActive(10);//최대 생성할 커넥션의 개수를 지정 : 디폴트 값 = 8
		//생성된 케넨션들을 다 빌려준 상태에서 대여 요청이 들어 온 경우 총 몇개까지 생성할지 결정
		//처음 만든 3개를 다 빌려주고 나서 더 요청이 들어올대 총 커넥션 개수가 10개가 될때까지는 계속 커넥션을 생성하라는 거고
		//10개가 넘는 커넥션 요청이 들어오면 익셉션을 발생시킨다.
		
		bs.setMaxIdle(5);//대여 가능한 커넥션의 최대 개수 - 디폴트 값 = 0
		//대여가능개수가 10개여도 맥스아이들이 5로 설정되면 대여가능 상태로 세팅되어 시동중인 커넥션은 5개를 유지한다. 그 이상을 미리 만들어놓고 준비하고 있지 않는다.
		bs.setMinIdle(3);//대여 가능한 커넥션의 최소 개수 - 디폴트 값 = 0
		//최소한 대기상태의 커넥션 객체를 3개 이상 준비상태로 만들어 놓겠다는 것
		bs.setMaxWait(1000);//대여할 커넥션이 없고 MaxActive 개수만큼 생성된 상태에서 대여 요청이 들어오면 대여중인 Connection이 반납될 때 까지 대기할 시간 설정(밀리초) - 디폴트 값 = 무한대
		
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		
		try{
			conn = bs.getConnection();
			pstmt = conn.prepareStatement("select * from department");
			rset = pstmt.executeQuery();
			while(rset.next()){
				System.out.println(rset.getString(1)+" - " + rset.getString(2)+" - "+rset.getString(3));
			}
		}finally{
			if(rset != null) rset.close();
			if(pstmt != null) pstmt.close();
			if(conn != null)conn.close();//연결을 끊는 것이 아닌 반납하는것
		}
	}
}
